package malagaAcoge.controller.daos;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.Query;

import malagaAcoge.model.entities.Demanda;
import malagaAcoge.model.entities.Intervencion;
import malagaAcoge.model.entities.Ofertavivienda;
import malagaAcoge.utils.JPAUtils;

public class IntervencionDao {
	private static JPAUtils jpaUtils;
	protected static EntityManager em;

	public IntervencionDao() {
		jpaUtils = new JPAUtils();

	}

	@SuppressWarnings("unchecked")
	public static List<Intervencion> findAll() {
		List<Intervencion> intervenciones = new ArrayList<Intervencion>();
		try {
			em = jpaUtils.getEntityManager();
			Query q = em.createQuery("select i from Intervencion i order by i.fecha desc");
			intervenciones = q.getResultList();
		} catch (Exception e) {
			System.out.println("Error en metodo findAllIntervencion");
			e.printStackTrace();
		} finally {
			em.close();
		}
		return intervenciones;

	}

	public static Intervencion findIntervencion(int id) {
		Intervencion intervencion = null;
		try {
			em = jpaUtils.getEntityManager();
			intervencion = (Intervencion) em.find(Intervencion.class, id);
		} catch (Exception e) {
			System.out.println("Error en metodo findIntervencion");
			e.printStackTrace();
		} finally {
			em.close();
		}
		return intervencion;

	}

	public static void createIntervencion(Intervencion intervencion) {
		try {
			em = jpaUtils.getEntityManager();
			em.getTransaction().begin();
			em.persist(intervencion);
			em.getTransaction().commit();
		} catch (Exception e) {
			System.out.println("Error en metodo createIntervencion:");
			e.printStackTrace();
		} finally {
			em.close();
		}

	}
	public static void createOfertaVivienda(Ofertavivienda oferta) {
		try {
			em = jpaUtils.getEntityManager();
			em.getTransaction().begin();
			em.persist(oferta);
			em.getTransaction().commit();
		} catch (Exception e) {
			System.out.println("Error en metodo createOfertaVivienda:");
			e.printStackTrace();
		} finally {
			em.close();
		}

	}

	public static void updateIntervencion(Intervencion intervencion) {
		try {
			em = jpaUtils.getEntityManager();
			em.getTransaction().begin();
			em.merge(intervencion);
			em.getTransaction().commit();

		} catch (Exception e) {
			System.out.println("Error en metodo updateIntervencion:");
			e.printStackTrace();
		} finally {
			em.close();
		}
	}

	public static void deleteIntervencion(int idIntervencion) {
		try {
			em = jpaUtils.getEntityManager();
			Intervencion intervencion = em.find(Intervencion.class,
					idIntervencion);
			if (intervencion != null) {
				em.getTransaction().begin();
				em.remove(intervencion);
				em.getTransaction().commit();
			}
		} catch (Exception e) {
			System.out.println("Error en metodo deleteIntervencion:");
			e.printStackTrace();
		} finally {
			em.close();
		}
	}

	public static void mergeIntervencion(Intervencion intervencion) {
		try {
			em = jpaUtils.getEntityManager();
			em.getTransaction().begin();
			em.merge(intervencion);
			em.getTransaction().commit();
		} catch (Exception e) {
			System.out.println("Error en metodo updateIntervencion:");
			e.printStackTrace();
		} finally {
			em.close();
		}
	}

	@SuppressWarnings("unchecked")
	public static List<Intervencion> findIntervencionsDeDepartamento(int idDepartamento) {
		List<Intervencion> intervencions = new ArrayList<Intervencion>();
		try {
			em = jpaUtils.getEntityManager();
			Query q = em
					.createQuery(
							"select i from Intervencion i where i.tecnicoBean.departamentoBean.idDepartamento = :valor " +
							"order by i.fecha desc")
					.setParameter("valor", idDepartamento);
			intervencions = q.getResultList();
		} catch (NoResultException e) {
			System.out.println("No hay intervencions para el departamento: "
					+ idDepartamento);
		} catch (Exception e) {
			System.out.println("Error en metodo findIntervencionsDeDepartamento");
			e.printStackTrace();
		} finally {
			em.close();
		}
		return intervencions;
	}

	@SuppressWarnings("unchecked")
	public static List<Intervencion> findIntervencionsDeUsuario(int idDepartamento,
			int idUsuario) {
		List<Intervencion> intervencions = new ArrayList<Intervencion>();
		try {
			em = jpaUtils.getEntityManager();
			Query q = em
					.createQuery(
							"select d from Intervencion d where d.tecnicoBean.departamentoBean.idDepartamento = :valor " +
							"and d.usuarioBean.idUsuario= :idUsuario order by d.fecha desc")
					.setParameter("valor", idDepartamento)
					.setParameter("idUsuario", idUsuario);
			intervencions = q.getResultList();
		} catch (NoResultException e) {
			System.out.println("No hay intervencions para el departamento: "
					+ idDepartamento);
		} catch (Exception e) {
			System.out.println("Error en metodo findIntervencionsDeUsuario:");
			e.printStackTrace();
		} finally {
			em.close();
		}
		return intervencions;
	}
	@SuppressWarnings("unchecked")
	public static List<Intervencion> findIntervencionsDeUsuario(int idUsuario) {
		List<Intervencion> intervencions = new ArrayList<Intervencion>();
		try {
			em = jpaUtils.getEntityManager();
			Query q = em
					.createQuery(
							"select d from Intervencion d where d.usuarioBean.idUsuario= :idUsuario order by d.fecha desc")
					.setParameter("idUsuario", idUsuario);
			intervencions = q.getResultList();
		} catch (NoResultException e) {
			System.out.println("No hay intervencions para el usuario: "
					+ idUsuario);
		} catch (Exception e) {
			System.out.println("Error en metodo findIntervencionsDeUsuario:");
			e.printStackTrace();
		} finally {
			em.close();
		}
		return intervencions;
	}
}
